package controller;

import eccezioni.UtenteBannatoException;
import eccezioni.UtenteNonTrovatoException;
import eccezioni.UtenteNonVerificatoException;
import entity.UtenteRegistrato;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Metodi per il login
 * @author Ale
 */
@Stateless
public class ControllerLogin implements ControllerLoginLocal {

    @PersistenceContext(unitName = "ShippingShareBisBis-ejbPU")
    private EntityManager em;

    /**
     * Cerca l'utente avente la mail e la password specificate
     * @param mail mail con cui l'utente si è registrato
     * @param password password per l'accesso 
     * @return l'utente se la coppia mail/password è corretta
     * @throws UtenteNonTrovatoException se la coppia mail/password non è presente nel sistema
     * @throws UtenteBannatoException se l'utente è stato trovato, ma è bannato
     * @throws UtenteNonVerificatoException se l'utente è stato trovato, ma non è ancora stato verificato (la registrazione non è completa)
     */
    @Override
    public UtenteRegistrato login(String mail, String password) throws UtenteNonTrovatoException, UtenteBannatoException, UtenteNonVerificatoException {
        String crittoPassword = UtenteRegistrato.cripta(password);

        String query = "SELECT x FROM UtenteRegistrato x WHERE x.indirizzoEmail.indirizzo = ?1 AND x.crittoPassword = ?2";
        Query q = em.createQuery(query);
        q.setParameter(1, mail);
        q.setParameter(2, crittoPassword);
        try {
            UtenteRegistrato ur = (UtenteRegistrato) q.getSingleResult();
            if (ur.isBannato()) {
                throw new UtenteBannatoException("Sei stato bannato da Shipping Share.");
            } else if (!ur.isVerificato()) {
                throw new UtenteNonVerificatoException("Non hai ancora verificato il tuo utente.<br/>Ti abbiamo mandato un link all'indirizzo " + ur.getEmail().getIndirizzo() + ".<br/>Cliccalo per compleatre la registrazione a Shipping Share");
            }
            return ur;
        } catch (NoResultException nre) {
            throw new UtenteNonTrovatoException("L'e-mail o la password inserite sono errate. Riprova!");
        }

    }

    /**
     * Cerca l'utente avente la mail specificata, e che si è iscritto non direttamente sul sito
     * @param mail mail con cui l'utente si è registrato
     * @return l'utente se la mail è presente nel sistema
     * @throws UtenteNonTrovatoException se la mail non è presente nel sistema 
     * @throws UtenteBannatoException se l'utente è stato trovato, ma è bannato
     * @throws UtenteNonVerificatoException se l'utente è stato trovato, ma non è ancora stato verificato (la registrazione non è completa)
     */
    @Override
    public UtenteRegistrato loginOpenId(String mail) throws UtenteNonTrovatoException, UtenteBannatoException, UtenteNonVerificatoException {
        String query = "SELECT x FROM UtenteRegistrato x WHERE x.indirizzoEmail.indirizzo = ?1";
        Query q = em.createQuery(query);
        q.setParameter(1, mail);
        try {
            UtenteRegistrato ur = (UtenteRegistrato) q.getSingleResult();
            if (ur.isBannato()) {
                throw new UtenteBannatoException("Sei stato bannato da Shipping Share.");
            } else if (!ur.isVerificato()) {
                throw new UtenteNonVerificatoException("Non hai ancora verificato il tuo utente.<br/>Ti abbiamo mandato un link all'indirizzo " + ur.getEmail().getIndirizzo() + ".<br/>Cliccalo per compleatre la registrazione a Shipping Share");
            }
            return ur;
        } catch (NoResultException nre) {
            throw new UtenteNonTrovatoException("L'e-mail o la password inserite sono errate. Riprova!");
        }
    }

    /**
     * Persistenza
     * @param object
     */
    public void persist(Object object) {
        em.persist(object);
    }
    
}
